故事:ZK 像“三胞胎”一起记账,半数以上同意才算数,挂掉一台也能继续工作。
架构
• Leader + Follower + Observer(选主、写请求转发)
• 数据完全复制(事务日志 + 快照)选主算法 ZAB(ZooKeeper Atomic Broadcast)
• 崩溃恢复阶段:投票 → 选 epoch 最大的节点为新 Leader
• 消息广播阶段:Leader 生成全局递增 zxid,两阶段提交(先写本地日志,再广播 COMMIT)高可用关键点
• 奇数节点:3 节点集群可容忍 1 台宕机;5 节点容忍 2 台。
• 快速选主:默认 tickTime=2s + syncLimit=5,10s 内完成切换。
• 数据一致性:半数确认写成功,客户端永远读到最新已提交数据。
最小 Docker 高可用脚本
bash
docker network create zk-net
for i in 1 2 3; do
docker run -d --name zk$i --net zk-net \
-e ZOO_MY_ID=$i \
-e ZOO_SERVERS="server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181" \
zookeeper:3.8
done面试一句话总结
• ZooKeeper 高可用 = “三胞胎记账”:半数存活即可读写,ZAB 选主 + 事务日志复制。